package com.example.lotterysystem.service.Impl;
//impl中是要实现service层的接口的


import cn.hutool.crypto.digest.DigestUtil;
import com.example.lotterysystem.common.util.RegexUtil;
import com.example.lotterysystem.common.errorcode.ServiceErrorCodeConstants;
import com.example.lotterysystem.common.exception.ServiceException;
import com.example.lotterysystem.controller.param.UserRegisterParam;
import com.example.lotterysystem.dao.daoobject.Encrypt;
import com.example.lotterysystem.dao.daoobject.UserDO;
import com.example.lotterysystem.dao.mapper.UserMapper;
import com.example.lotterysystem.service.UserService;
import com.example.lotterysystem.service.dto.UserRegisterDTO;
import com.example.lotterysystem.service.enums.UserIdentityEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
   private UserMapper userMapper;
    @Override
    public UserRegisterDTO register(UserRegisterParam param) {
//        service层的流程大致为
//        校验注册信息,用一个方法
        checkRegisterInfo(param);
//        加密私密数据(构造dao层请求)
//       这里构造一个对象
        UserDO userDO=new UserDO();
        userDO.setUserName(param.getName());
        userDO.setEmail(param.getEmail());
        userDO.setIdentity(param.getIdentity());
        userDO.setPhoneNumber(new Encrypt(param.getPhoneNumber()));
        if(StringUtils.hasText(param.getPassword())){
            userDO.setPassword(DigestUtil.sha256Hex(param.getPassword()));
        }
        userMapper.insert(userDO);
        UserRegisterDTO userRegisterDTO=new UserRegisterDTO();
        userRegisterDTO.setUserId(userDO.getId());
        return userRegisterDTO;
    }

    public void checkRegisterInfo(UserRegisterParam param){
//        在开始校验之前话还是要校验传入的信息是否为空
        if(param==null){
            throw new ServiceException(ServiceErrorCodeConstants.REGISTER_INFO_EMPTY);
        }
//        检验格式使用的方法如下.
//        校验邮箱格式
        if(!RegexUtil.checkMail(param.getEmail())){
            throw new ServiceException(ServiceErrorCodeConstants.MAIL_ERROR);
        }
//        校验手机号格式
        if(!RegexUtil.checkMobile(param.getPhoneNumber())){
            throw new ServiceException(ServiceErrorCodeConstants.PHONE_NUMBER_ERROR);
        }
//        校验身份信息,就是看填入的信息是否是ADMIN或者NORMAL
        if(null==UserIdentityEnum.forName(param.getIdentity())){
            throw new ServiceException(ServiceErrorCodeConstants.INENTITY_ERROR);
        }
//        校验管理员密码是否填写/校验是否是管理员以及密码是否填写,是管理员并且没有正文.就需要进行判断
        if(param.getIdentity().equalsIgnoreCase(UserIdentityEnum.ADMIN.name())&&!StringUtils.hasText(param.getPassword()))
        {
            throw new ServiceException(ServiceErrorCodeConstants.PASSWORD_IS_EMPTY);
        }
//密码校验,至少六位
        if(!RegexUtil.checkPassword(param.getPassword())){
            throw new ServiceException(ServiceErrorCodeConstants.PASSWORD_ERROR);
        }
//        校验邮箱是否被使用
        if(checkMailUsed(param.getEmail())){
            throw new ServiceException(ServiceErrorCodeConstants.MAIL_USED);
        }

//        校验手机号是否被使用
        if(checkPhoneNumberUser(param.getPhoneNumber())){
            throw new ServiceException(ServiceErrorCodeConstants.PHONE_NUMBER_USED);
        }

    }

    private boolean checkPhoneNumberUser(String phoneNumber) {
//        这里与校验邮箱时有所不同,手机号需要进行加密
     int count=userMapper.countByPhone(new Encrypt(phoneNumber));
     return count>0;
    }

    private boolean checkMailUsed(String mail) {
    return  userMapper.countByMail(mail)>0;
    }


}
